package xuecheng.tool.mq.rabbitmq;

/**
 * 交换机类型
 *
 * <pre>
 * direct Exchange 、 topic Exchange 依赖 routing key ，
 * 而 fanout Exchange 、 headers Exchange 不依赖 routing key
 * 比较常用的还是 direct Exchange 、 topic Exchange
 * </pre>
 *
 * <pre>
 * 理解 Exchange: https://zhuanlan.zhihu.com/p/37198933
 * </pre>
 *
 * @author PengXueCheng
 * @version 1.0.0
 **/
public enum ExchangeType {

    /**
     * 直连交换机，该交换机会完全匹配 routing key (完全一致才算匹配)，将消息转发到匹配的队列上
     *
     */
    DIRECT("direct"),
    /**
     * <pre>
     * 主题交换机，该交换机会模糊匹配 routing key，将消息转发到匹配的队列上
     *
     * name.* : 匹配以name.开头的，后面是任意不含.字符串，比如 name.abc
     * name.# : 匹配以name.开头的，后面是任意字符串，比如 name.abc、name.abc.abc
     * </pre>
     */
    TOPIC("topic"),
    /**
     * 广播交换机，该交换机不管 routing key 将消息转发到所有绑定到该交换机的队列上
     */
    FANOUT("fanout"),
    /**
     * headers类型的交换机分发消息不依赖routingKey,是使用发送消息时basicProperties对象中的headers来匹配的。headers是一个键值对类型，
     * 发送者发送消息时将这些键值对放到basicProperties对象中的headers字段中，队列绑定交换机时绑定一些键值对，当两者匹配时，队列就可以收到消息。
     * 匹配模式有两种，在队列绑定到交换机时用x-match来指定，all代表定义的多个键值对都要满足，而any则代码只要满足一个就可以了
     */
    @Deprecated HEADERS("headers");

    private final String value;

    ExchangeType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
